package utilities;

import java.sql.*;

/**
 * Created with IntelliJ IDEA.
 * User: Jordi
 * Date: 3/01/13
 * Time: 19:12
 * To change this template use File | Settings | File Templates.
 */
public class DadesAuxiliars implements ParameterMetaData, java.io.Serializable{

    protected Object[] parametros;
    protected int[] parametroModo;
    protected int[] parametroTipo;
    protected String[] parametroNombreTipo;
    protected int[] precision;
    protected int[] escala;
    protected int[] tipoNull;
    protected boolean[] firmado;
    protected String[] parametroNombre;
    protected int parametroContador;
    public DadesAuxiliars() {
    }
    @Override
    public boolean isWrapperFor(Class iface){
        return false;
    }
    @Override
    public Class unwrap(Class iface){
        return null;
    }
    public DadesAuxiliars(int parametroContador) {
        setParams(new Object[parametroContador]);
    }
    protected void init(){
        this.parametroContador = this.parametros.length;
        this.parametroModo = new int[parametroContador];
        this.parametroTipo = new int[parametroContador];
        this.parametroNombreTipo = new String[parametroContador];
        this.precision = new int[parametroContador];
        this.escala = new int[parametroContador];
        this.tipoNull = new int[parametroContador];
        this.firmado = new boolean[parametroContador];
        this.parametroNombre = new String[parametroContador];
    }
    public DadesAuxiliars(Object[] dadesAuxiliars) {
        setParams(dadesAuxiliars);
    }
    @Override
    public String getParameterClassName(int indice) throws SQLException {
        return parametros[indice - 1].getClass().getName();
    }
    @Override
    public int getParameterCount() throws SQLException {
        return parametroContador;
    }
    @Override
    public int getParameterMode(int indice) throws SQLException {
        return parametroModo[indice - 1];
    }
    public void setParameterMode(int indice, int parametroModo) throws SQLException {
        this.parametroModo[indice - 1] = parametroModo;
    }
    @Override
    public int getParameterType(int indice) throws SQLException {
        return parametroTipo[indice - 1];
    }
    public void setParameterType(int indice, int parametroTipo) throws SQLException {
        this.parametroTipo[indice - 1] = parametroTipo;
    }
    @Override
    public String getParameterTypeName(int indice) throws SQLException {
        return parametroNombreTipo[indice - 1];
    }
    public void setParameterTypeName(int indice, String parametroNombreTipo) throws SQLException {
        this.parametroNombreTipo[indice - 1] = parametroNombreTipo;
    }
    @Override
    public int getPrecision(int indice) throws SQLException {
        return precision[indice - 1];
    }
    public void setPrecision(int indice, int precision) throws SQLException {
        this.precision[indice - 1] = precision;
    }
    @Override
    public int getScale(int indice) throws SQLException {
        return escala[indice - 1];
    }
    public void setScale(int indice, int escala) throws SQLException {
        this.escala[indice - 1] = escala;
    }
    @Override
    public int isNullable(int indice) throws SQLException {
        return tipoNull[indice - 1];
    }
    public void setNullable(int indice, int tipoNull) throws SQLException {
        this.tipoNull[indice - 1] = tipoNull;
    }
    @Override
    public boolean isSigned(int indice) throws SQLException {
        return firmado[indice - 1];
    }
    public void setSigned(int indice, boolean firmado) throws SQLException {
        this.firmado[indice - 1] = firmado;
    }
    public Object[] getParams() {
        return parametros;
    }
    public void setParams(Object[] parametros) {
        this.parametros = parametros;
        init();
    }
    public Object getParameter(int indice) {
        return parametros[indice - 1];
    }
    public Object getParameter(String parametroNombre) throws SQLException {
        return parametros[getParameterIndex(parametroNombre) - 1];
    }
    public void setParameter(int indice, Object valor) {
        this.parametros[indice - 1] = valor;
    }
    public String getParameterName(int indice) throws SQLException {
        return parametroNombre[indice - 1];
    }
    public void setParameterName(int indice, String parametroNombre) throws SQLException {
        if (parametroNombre == null || parametroNombre.trim().length() == 0){
            throw new SQLException("Nombre de parametro no existe");
        }
        parametroNombre = parametroNombre.trim();
        for (int i = 0;i < parametroContador;i++){
            String nombre = this.parametroNombre[i];
            if (nombre != null && nombre.equalsIgnoreCase(parametroNombre)){
                throw new SQLException("Nombre parametro duplicado: " + parametroNombre);
            }
        }
        this.parametroNombre[indice - 1] = parametroNombre;
    }
    public int getParameterIndex(String parametroNombre) throws SQLException {
        if (parametroNombre == null || parametroNombre.trim().length() == 0){
            return -1;
        }
        for (int i = 0;i < parametroContador;i++){
            String nombre = this.parametroNombre[i];
            if (nombre != null && nombre.equalsIgnoreCase(parametroNombre)){
                return i + 1;
            }
        }
        return -1;
    }
    @Override
    public String toString(){
        StringBuffer sb = new StringBuffer();
        for (int i = 0;i < parametroContador;i++){
            sb.append("\nparam").append(i + 1).append(": ");
            sb.append("&parametroNombre=").append(parametroNombre[i]);
            sb.append("&valor=").append(parametros[i]);
            sb.append("&parametroModo=").append(parametroModo[i]);
            sb.append("&parametroTipo=").append(parametroTipo[i]);
            sb.append("&parametroNombreTipo=").append(parametroNombreTipo[i]);
            sb.append("&precision=").append(precision[i]);
            sb.append("&escala=").append(escala[i]);
            sb.append("&tipoNull=").append(tipoNull[i]);
            sb.append("&firmado=").append(firmado[i]);
        }
        return sb.toString();
    }
}
